#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
#include <string.h>

// 这里定义了abcd4个变量的联合体。
// 他们公用空间。
// 整个联合体的空间为最大成员的空间。
// 修改联合体任意一成员内容，其他成员内容会受影响。
// 联合体变量地址，与联合体各成员地址一致。
union unionDefine
{
    int a;   // 4字节
    char b;  // 1字节
    short c; // 2字节
    long d;  // 8字节(32位系统为4字节)
    // 因此联合体的空间是8字节。
};

void printUnionValues(union unionDefine printval, int mainline)
{
    printf("[main:%d]union p=%p, ap=%p, a = %d\n", mainline, &printval, &printval.a, printval.a);
    printf("[main:%d]union p=%p, bp=%p, b = %d\n", mainline, &printval, &printval.b, printval.b);
    printf("[main:%d]union p=%p, cp=%p, c = %d\n", mainline, &printval, &printval.c, printval.c);
    printf("[main:%d]union p=%p, dp=%p, d = %ld\n", mainline, &printval, &printval.d, printval.d);
}

union unionDefine1
{
    int a;
    char b;
    short c;
    long d;
    char e[1];
};
void printUnionValues1(union unionDefine1 printval, int mainline)
{
    printf("[main:%d]union p=%p, ap=%p, a = %x\n", mainline, &printval, &printval.a, printval.a);
    printf("[main:%d]union p=%p, bp=%p, b = %x\n", mainline, &printval, &printval.b, printval.b);
    printf("[main:%d]union p=%p, cp=%p, c = %x\n", mainline, &printval, &printval.c, printval.c);
    printf("[main:%d]union p=%p, dp=%p, d = %lx\n", mainline, &printval, &printval.d, printval.d);
}

// 备注：大端系统和小端系统测试会不一样。这里是小端。
int main(int argc, char **argv)
{
    union unionDefine tmpunion;
    printf("sizeof(union) = %lu\n", sizeof(tmpunion)); // 32位系统为4，64位系统为8
    tmpunion.a = 1;
    printUnionValues(tmpunion, __LINE__);

    tmpunion.b = 2;
    printUnionValues(tmpunion, __LINE__);

    tmpunion.c = 3;
    printUnionValues(tmpunion, __LINE__);

    tmpunion.d = -1;
    printUnionValues(tmpunion, __LINE__);

    union unionDefine1 *tmpu1 = malloc(4);
    for (int i = 0; i < 4; i++)
    {
        tmpu1->e[i] = 1;
    }
    printUnionValues1(*tmpu1, __LINE__);
    return 1;
}
